using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Icbf.EXTUD.Entity;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;


namespace UD.EXTUD.DataAccess
{
    public class CursoDAL : GeneralDAL
    {
        public CursoDAL()
        {
        }
        public int InsertarCurso(Curso pCurso)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_EXTUD_Curso_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdCurso", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@IdTipoCurso", DbType.Int32, pCurso.IdTipoCurso);
                    vDataBase.AddInParameter(vDbCommand, "@NombreCurso", DbType.String, pCurso.NombreCurso);
                    vDataBase.AddInParameter(vDbCommand, "@DuracionCurso", DbType.Int32, pCurso.DuracionCurso);
                    vDataBase.AddInParameter(vDbCommand, "@FechaInicioCurso", DbType.DateTime, pCurso.FechaInicioCurso);
                    vDataBase.AddInParameter(vDbCommand, "@FechaFinalizacionCurso", DbType.DateTime, pCurso.FechaFinalizacionCurso);
                    vDataBase.AddInParameter(vDbCommand, "@VersionCurso", DbType.Int32, pCurso.VersionCurso);
                    vDataBase.AddInParameter(vDbCommand, "@CapacidadCurso", DbType.Int32, pCurso.CapacidadCurso);
                    vDataBase.AddInParameter(vDbCommand, "@ValorCurso", DbType.Decimal, pCurso.ValorCurso);
                    vDataBase.AddInParameter(vDbCommand, "@IdProyectoCurricular", DbType.Int32, pCurso.IdProyectoCurricular);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pCurso.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pCurso.IdCurso = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdCurso").ToString());
                    GenerarLogAuditoria(pCurso, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarCurso(Curso pCurso)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_EXTUD_Curso_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdCurso", DbType.Int32, pCurso.IdCurso);
                    vDataBase.AddInParameter(vDbCommand, "@IdTipoCurso", DbType.Int32, pCurso.IdTipoCurso);
                    vDataBase.AddInParameter(vDbCommand, "@NombreCurso", DbType.String, pCurso.NombreCurso);
                    vDataBase.AddInParameter(vDbCommand, "@DuracionCurso", DbType.Int32, pCurso.DuracionCurso);
                    vDataBase.AddInParameter(vDbCommand, "@FechaInicioCurso", DbType.DateTime, pCurso.FechaInicioCurso);
                    vDataBase.AddInParameter(vDbCommand, "@FechaFinalizacionCurso", DbType.DateTime, pCurso.FechaFinalizacionCurso);
                    vDataBase.AddInParameter(vDbCommand, "@VersionCurso", DbType.Int32, pCurso.VersionCurso);
                    vDataBase.AddInParameter(vDbCommand, "@CapacidadCurso", DbType.Int32, pCurso.CapacidadCurso);
                    vDataBase.AddInParameter(vDbCommand, "@ValorCurso", DbType.Decimal, pCurso.ValorCurso);
                    vDataBase.AddInParameter(vDbCommand, "@IdProyectoCurricular", DbType.Int32, pCurso.IdProyectoCurricular);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pCurso.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pCurso, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarCurso(Curso pCurso)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_EXTUD_Curso_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdCurso", DbType.Int32, pCurso.IdCurso);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pCurso, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public Curso ConsultarCurso(int pIdCurso)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_EXTUD_Curso_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdCurso", DbType.Int32, pIdCurso);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        Curso vCurso = new Curso();
                        while (vDataReaderResults.Read())
                        {
                            vCurso.IdCurso = vDataReaderResults["IdCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdCurso"].ToString()) : vCurso.IdCurso;
                            vCurso.IdTipoCurso = vDataReaderResults["IdTipoCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdTipoCurso"].ToString()) : vCurso.IdTipoCurso;
                            vCurso.NombreCurso = vDataReaderResults["NombreCurso"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreCurso"].ToString()) : vCurso.NombreCurso;
                            vCurso.DuracionCurso = vDataReaderResults["DuracionCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["DuracionCurso"].ToString()) : vCurso.DuracionCurso;
                            vCurso.FechaInicioCurso = vDataReaderResults["FechaInicioCurso"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaInicioCurso"].ToString()) : vCurso.FechaInicioCurso;
                            vCurso.FechaFinalizacionCurso = vDataReaderResults["FechaFinalizacionCurso"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaFinalizacionCurso"].ToString()) : vCurso.FechaFinalizacionCurso;
                            vCurso.VersionCurso = vDataReaderResults["VersionCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["VersionCurso"].ToString()) : vCurso.VersionCurso;
                            vCurso.CapacidadCurso = vDataReaderResults["CapacidadCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["CapacidadCurso"].ToString()) : vCurso.CapacidadCurso;
                            vCurso.ValorCurso = vDataReaderResults["ValorCurso"] != DBNull.Value ? Convert.ToDecimal(vDataReaderResults["ValorCurso"].ToString()) : vCurso.ValorCurso;
                            vCurso.IdProyectoCurricular = vDataReaderResults["IdProyectoCurricular"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdProyectoCurricular"].ToString()) : vCurso.IdProyectoCurricular;
                            vCurso.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vCurso.UsuarioCrea;
                            vCurso.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vCurso.FechaCrea;
                            vCurso.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vCurso.UsuarioModifica;
                            vCurso.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vCurso.FechaModifica;
                        }
                        return vCurso;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<Curso> ConsultarCursos(int? pIdTipoCurso, String pNombreCurso, DateTime? pFechaInicioCurso, DateTime? pFechaFinalizacionCurso, Decimal? pValorCurso, int? pIdProyectoCurricular)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_EXTUD_Cursos_Consultar"))
                {
                    if(pIdTipoCurso != null)
                         vDataBase.AddInParameter(vDbCommand, "@IdTipoCurso", DbType.Int32, pIdTipoCurso);
                    if(pNombreCurso != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombreCurso", DbType.String, pNombreCurso);
                    if(pFechaInicioCurso != null)
                         vDataBase.AddInParameter(vDbCommand, "@FechaInicioCurso", DbType.DateTime, pFechaInicioCurso);
                    if(pFechaFinalizacionCurso != null)
                         vDataBase.AddInParameter(vDbCommand, "@FechaFinalizacionCurso", DbType.DateTime, pFechaFinalizacionCurso);
                    if(pValorCurso != null)
                         vDataBase.AddInParameter(vDbCommand, "@ValorCurso", DbType.Decimal, pValorCurso);
                    if(pIdProyectoCurricular != null)
                         vDataBase.AddInParameter(vDbCommand, "@IdProyectoCurricular", DbType.Int32, pIdProyectoCurricular);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<Curso> vListaCurso = new List<Curso>();
                        while (vDataReaderResults.Read())
                        {
                                Curso vCurso = new Curso();
                            vCurso.IdCurso = vDataReaderResults["IdCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdCurso"].ToString()) : vCurso.IdCurso;
                            vCurso.IdTipoCurso = vDataReaderResults["IdTipoCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdTipoCurso"].ToString()) : vCurso.IdTipoCurso;
                            vCurso.NombreCurso = vDataReaderResults["NombreCurso"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreCurso"].ToString()) : vCurso.NombreCurso;
                            vCurso.DuracionCurso = vDataReaderResults["DuracionCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["DuracionCurso"].ToString()) : vCurso.DuracionCurso;
                            vCurso.FechaInicioCurso = vDataReaderResults["FechaInicioCurso"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaInicioCurso"].ToString()) : vCurso.FechaInicioCurso;
                            vCurso.FechaFinalizacionCurso = vDataReaderResults["FechaFinalizacionCurso"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaFinalizacionCurso"].ToString()) : vCurso.FechaFinalizacionCurso;
                            vCurso.VersionCurso = vDataReaderResults["VersionCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["VersionCurso"].ToString()) : vCurso.VersionCurso;
                            vCurso.CapacidadCurso = vDataReaderResults["CapacidadCurso"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["CapacidadCurso"].ToString()) : vCurso.CapacidadCurso;
                            vCurso.ValorCurso = vDataReaderResults["ValorCurso"] != DBNull.Value ? Convert.ToDecimal(vDataReaderResults["ValorCurso"].ToString()) : vCurso.ValorCurso;
                            vCurso.IdProyectoCurricular = vDataReaderResults["IdProyectoCurricular"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdProyectoCurricular"].ToString()) : vCurso.IdProyectoCurricular;
                            vCurso.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vCurso.UsuarioCrea;
                            vCurso.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vCurso.FechaCrea;
                            vCurso.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vCurso.UsuarioModifica;
                            vCurso.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vCurso.FechaModifica;
                                vListaCurso.Add(vCurso);
                        }
                        return vListaCurso;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
